{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# AboutHydrology\n",
    "\n",
    "我关于水文学和水文学家的思考和笔记。我日常工作的进展，特别是对我的学生，也是对耐心阅读的人。\n",
    "\n",
    "2016年12月25日星期五\n",
    "\n",
    "## 水文学家的Python资源\n",
    "\n",
    "Python是一种面向对象的高级语言。我偶尔也会在我的[帖子](http://abouthydrology.blogspot.it/search/label/Python)里提到它，也会说我去了一个不同的方向。然而，我不能否认越来越多的人选择使用它的证据，而且有充分的理由，作为他们从事研究和水文学应用选择的语言。下面你会找到一个资源列表。请不要犹豫，将我的注意力放在你们或其他人的贡献上，我还没有在我的小组中做出贡献。\n",
    "\n",
    "在这个博客[帖子](https://steppe.org/python-a-fundamental-tool-in-the-geoscientists-toolbox/)或这篇[文章](http://journals.ametsoc.org/doi/full/10.1175/BAMS-D-12-00148.1)中可以找到选择使用Python而不是选择其他编程语言的动机。\n",
    "\n",
    "要了解如何开始，你可以按照[Python programming for hydrology students](http://python.hydrology-amsterdam.nl/)开始，指导你如何进行安装。\n",
    "\n",
    "有许多开始学习Python的资源，但是对于水文学者来讲，建议使用这些：\n",
    "\n",
    "- [Python in Hydrology](http://greenteapress.com/pythonhydro/pythonhydro.html)\n",
    "- [Python programming guide for Earth Scientists](http://210.36.16.123/videoplayer/hydro_python_manual.pdf?ich_u_r_i=4080159eeabee7423878d467ee1ddd2b&ich_s_t_a_r_t=0&ich_e_n_d=0&ich_k_e_y=1745128916750463252443&ich_t_y_p_e=1&ich_d_i_s_k_i_d=1&ich_u_n_i_t=1)\n",
    "- [A Hands-On Introduction to Using Python in the Atmospheric and Oceanic Sciences](http://www.johnny-lin.com/pyintro/)\n",
    "\n",
    "优先考虑第一本。Bittelli等人写的[Soil Physics with Python: Transport in the Soil-Plant-Atmosphere System,by Bittelli et al](https://www.amazon.it/Soil-Physics-Python-Transport-Soil-Plant-Atmosphere-ebook/dp/B00WUW1E42/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1480004215&sr=1-1&keywords=Soil+Physics+with+Python%3A+Transport+in+the+Soil-Plant-Atmosphere+System)是一本关于土壤科学的，这本书非常有吸引力(如TOC所见)：kindle版本价格合理，但我没有。Python程序在[这里](http://www.dista.unibo.it/~bittelli/soil_physics_python.php)可以找到。\n",
    "\n",
    "在[SciPy.org](https://www.scipy.org/topical-software.html)上给出了Python中一般使用的科学库和软件的概述，从中我将这些链接提取到文档中。\n",
    "\n",
    "- 科学计算Python教程：主要是[Numpy和Scipy文档](https://docs.scipy.org/doc/)。\n",
    "- [Scipy Lecture Notes](http://www.scipy-lectures.org/)：是Python科学计算的一个全套教程。\n",
    "- [Software Carpentry](https://software-carpentry.org/)是一个开源的，面向拥有科学、工程和医学背景人的基础软件开发技巧课程。\n",
    "- [Lectures on scientific computing with python](https://github.com/jrjohansson/scientific-python-lectures)by J.R.Johansson.\n",
    "- [Introduction to Statistics](http://www.springer.com/us/book/9783319283159)是一本介绍了统计学基本概念，并结合了一整套使用Python进行统计学数据分析应用案例的书(作者是T.Haslwanter)。[这](https://www.kevinsheppard.com/images/0/09/Python_introduction.pdf)是另外一本类似的书(作者是Kevin Sheppard)。\n",
    "- [Jupyter](http://jupyter.org/)notebooks是组织计算非常棒的方式。\n",
    "  \n",
    "Python特别是用作现有程序的粘合剂，无论是用C还是FORTRAN编写的。我们有如下的案例：\n",
    "\n",
    "- [CMF](http://fb09-pasig.umwelt.uni-giessen.de/cmf/)是一个用于创建水文模型的编程库。尽管是用C++编写的，但是它有Python接口。\n",
    "- [地球系统建模框架(ESMF)](https://www.earthsystemcog.org/projects/esmf/)重新栅格化已经与Python ESMPy接口。\n",
    "- [GRASS](https://grasswiki.osgeo.org/wiki/GRASS_and_Python)地理信息系统已经实现Python接口。\n",
    "- Python也实现了与[gvSIG](http://www.gvsig.com/en)的接口，你可以从[Geographic Scritping in gvSIG](http://jgrasstechtips.blogspot.com/2016/11/course-slides-geographic-scritping-in.html)看到。\n",
    "- [HPGL](http://hpgl.github.io/hpgl/)是一个高性能的地质统计学库，用C++编写的代码被Python粘合在一起。\n",
    "- [MODFLOW](https://water.usgs.gov/ogw/modflow/)地下水文模型由[FloPy](https://water.usgs.gov/ogw/flopy/)接口连接。文档和其它信息在[这里](https://blogs.egu.eu/network/water-underground/2016/08/04/flopy-a-python-interface-for-modflow-that-kicks-tail/)。\n",
    "- [PCRaster](http://pcraster.geo.uu.nl/)是一个针对时空环境模型开发和部署的软件集合。它有一个不断增强的python接口。\n",
    "- [Open Hydrology](https://github.com/OpenHydrology)是一个用Python编写的开源水文软件库,它以包的形式在一个伞形接口(umbrella interface)下进行操作。\n",
    "- [PyHSPF](https://github.com/djlampert/PyHSPF)：对Fortran水文模拟程序的Python拓展。\n",
    "- [PyQGIS](https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/intro.html):[QGIS(免费开源的地理信息系统)](https://www.qgis.org/en/site/)的一个Python接口。\n",
    "- [RhessysWorkflow ](https://github.com/selimnairb/RHESSysWorkflows):RHESSysWorkflows提供了用于构建[RHESSys](http://fiesta.bren.ucsb.edu/~rhessys/)模型的Python脚本。其它的关于RHESSys的Pythonic材料可以在[这里](https://github.com/selimnairb)找到。\n",
    "- [UWHydro](https://github.com/UW-Hydro)工具连接华盛顿大学的水文模型，特别是[VIC](https://vic.readthedocs.io/en/develop/)驱动程序[PythonDriver](https://vic.readthedocs.io/en/develop/Documentation/Drivers/Python/PythonDriver/)\n",
    "\n",
    "在水文学的应用中，完全用Python占主导地位编写，我们提醒：\n",
    "\n",
    "- [AMBHAS](http://ambhas.com/tools.php)：用Python编写的水文学库。\n",
    "- [ANUGA](https://sourceforge.net/projects/anuga/)[2(失效)](http://datamining.anu.edu.au/)模拟溃坝、河流泛滥、风暴草或海啸的软件包。用Python和C语言编写。\n",
    "- [EcoHydrolib](http://pythonhosted.org/ecohydrolib/)提供了进行生态水文学数据准备工作流程的一系列Python脚本。\n",
    "- [evaplib](http://python.hydrology-amsterdam.nl/modules/evaplib.py):包含计算蒸发速率函数的Python库。其功能包括Penman开放水分蒸发，Makkink参考蒸发，Priestley Taylor蒸发，Penman Monteith(1965)蒸发以及FAO的Penman Moteith ET0参考蒸发。另外还有一个函数可以通过温度波动计算感热通量。[查看evaplib模块功能的文档](http://python.hydrology-amsterdam.nl/moduledoc/index.html#module-evaplib)。模块文档也有[PDF版](http://python.hydrology-amsterdam.nl/moduledoc/Meteorologyandevaporationmodules.pdf)。作者:M.J.Waterloo。\n",
    "- [GLUE方法](http://code.activestate.com/pypm/pyglue/),广义似然不确定性估计(GLUE),由Joel Delsman于2011年在Deltares开发。\n",
    "- [Groundwater flow modelling manual](http://python.hydrology-amsterdam.nl/manuals/computer_labs_post.pdf):由Vincent post编写的Python地下水流动模型手册。\n",
    "- [Hydro-conductor](https://github.com/pacificclimate/hydro-conductor)：一组Python脚本和模块，用于将水文模型与区域冰川模型相结合。\n",
    "- [ODMToolsPyhon](https://github.com/ODM2)和[OMDMTools](https://github.com/ODM2/ODMToolsPython)是使用观测数据模型管理观测数据的Python应用程序。ODMTools允许您查询、可视化和编辑存储在观测数据模型(ODM)数据库中的数据。ODMTools最初是作为CUAHSI水文信息系统的一部分开发的。你可以在[这里](https://acwi.gov/monitoring/conference/2014/2ConcurrentSessions/J3/J3Horsburgh.pdf)找到介绍。\n",
    "- [PyETo](https://github.com/woodcrafty/PyETo)是一个用于计算参考/潜在蒸散量(ET0)的包。\n",
    "- [Python script for rectangular Piper plot (version December 2014)](http://python.hydrology-amsterdam.nl/scripts/piper_rectangular.py):根据Ray和Mukherjee(2008)地下水46(6)：893-896，用于在矩形python图上绘制化学数据(看[图](http://python.hydrology-amsterdam.nl/images/piper.png))。同时下载示例数据文件[watersamples.txt](http://python.hydrology-amsterdam.nl/data/watersamples.txt)。作者：B.M. van Breukelen。\n",
    "- [Python script for multiple Stiff plots (version June 2011)](http://python.hydrology-amsterdam.nl/scripts/stiff_fill.py)：用于多个板式图解的Python脚本(2011年6月版),用于(见[图](http://python.hydrology-amsterdam.nl/images/stiff.png))。\n",
    "- [Haran Kiruba tools for hydrology](https://github.com/Kirubaharan/hydrology)并不清楚他在做什么。\n",
    "- [USEPA site](https://github.com/usepa)包含各种python(和其他编程语言)工具,包括Epanet和SWMM的接口(与swmmtoolbox的连接在这里也是可用的)。\n",
    "- 美国地质调查局(USGS)也有它的[python工具](https://github.com/usgs?language=python)。\n",
    "- [sMAP](https://people.eecs.berkeley.edu/~stevedh/smap2/python_access.html) 2.0是一个教程，将介绍如何使用Python从[sMAP](https://smap.jpl.nasa.gov/data/)归档器中检索数据。\n",
    "- [ulmo](http://code.activestate.com/pypm/ulmo/)干净、简单和快速获取公共水文和气候资料。\n",
    "\n",
    "具体的水文模型列举如下。\n",
    "\n",
    "- [EXP-HYDRO Model ](https://sopanpatil.weebly.com/exp-hydro.html)模型是一个以日时间步长运行的流域规模水文模型。\n",
    "- [Landlab](https://landlab.github.io/)是一个基于Python的建模环境，允许科学家和学生构建数字景观模型。设专为量化地球表明动力学的学科(如地貌、水文、冰川学和地层学)而设计，也可以用在相关领域。\n",
    "- [LHMP](https://github.com/hydrogo/LHMP)集总水文模型平台-拥有完整预测环境的微型docker容器。\n",
    "- [PyCatch](https://dspace.library.uu.nl/handle/1874/310216)是在xx Python框架内构建的基于组件的流域水文模型。代码在[这里](https://github.com/joe-jordan/pycatch)，一篇相关的文章在[这里](file:///Users/riccardo/Downloads/Dialnet-PyCatchComponentBasedHydrologicalCatchmentModellin-4281308%20(2).pdf)。\n",
    "- [PyTOPKAPI](https://pypi.python.org/pypi/PyTOPKAPI)是BSD许可的Python库，实现了TOPKAPI水文模型(liu和Todini,2002)。该模型师一个基于物理的，全分布式的水文模型，已经在世界各国成功应用。\n",
    "- [SPHY](http://www.sphy.nl/). 详情请参阅模型和出版物(HESS,Nature等)。就在最近，一篇使用了SPHY模型的关于PlotS的气候变化和山区水文的新文章出现了，更多信息在[这里](http://www.futurewater.eu/2016/11/impacts-of-climate-change-on-the-upper-indus-basin/)。\n",
    "- [Topflow](https://github.com/peckhams/topoflow):Scott Peckham的Python水文模型。\n",
    "- [WOFpy](https://github.com/twhiteaker/WOFpy)是一个用python实现的[CUAHSI](http://his.cuahsi.org/)的Water One Flow服务栈。\n",
    "- [wflow](https://publicwiki.deltares.nl/display/OpenS/wflow+-+PCRaster-Python+based+distributed+hydrological+models)是一个分布式水文模型平台，目前包含两个模型：wflow_sbm模型(由[topog](http://www.per.clw.csiro.au/topog/intro/intro.html)_sbm土壤概念推导)和wflow_hbv模型(是[HBV模型](http://www.smhi.se/sgn0106/if/hydrologi/hbv.htm)的分布式版本)。这是名为[OpenStream](https://publicwiki.deltares.nl/display/OpenS/Home)的一个更大的Deltares项目的一部分。\n",
    "\n",
    "GIS功能也存在：\n",
    "\n",
    "- 使用[PyWPS + GRASS + QGIS](http://geoinformatics.fsv.cvut.cz/pdf/)选择水文响应单元(HRU)。\n",
    "- [PyDEM](https://github.com/emilopez/pydem):一个python数字高程模型分析包。请注意，pyDEM依赖于TauDEM的某些步骤(例如填充)，并且还广泛的使用GDAL库来处理地理空间栅格。([有关一个小视频](https://www.youtube.com/watch?v=bGulPZh_-Mo))\n",
    "- [PyGeoprocessing](https://pypi.python.org/pypi/pygeoprocessing)是一个基于Python/Cython的库，为GIS处理提供了一套常用的栅格、矢量和水文操作。\n",
    "\n",
    "也有处理气象的工具:\n",
    "\n",
    "- :包含气象功能的Python库，用于计算大气压、空气密度、汽化潜热、恒压热容、恒温、日长、外星辐射输入、潜在温度和风向量。这个模块的文档介绍在这([metelib模块功能网站](http://python.hydrology-amsterdam.nl/moduledoc/index.html#module-meteolib))。将基于时间的数据记录转换为等间距时间间隔记录(event2time)及将日期值转化为年份值(date2doy)的函数现在位于单独的[meteo_util](http://python.hydrology-amsterdam.nl/modules/meteo_util.py)模块中。文档介绍在[这里(meteo_util模块函数网站)](http://python.hydrology-amsterdam.nl/moduledoc/index.html#module-meteo_util)。模块文档也有[PDF文档](http://python.hydrology-amsterdam.nl/moduledoc/Meteorologyandevaporationmodules.pdf)。作者:M.J. Waterloo。\n",
    "- [MetPy](https://www.unidata.ucar.edu/blogs/news/entry/metpy_an_open_source_python)是一个开源的气象工具包。\n",
    "- [Melodist](https://zenodo.org/record/54676#.Wjk1G-2GOM9)(气象观测时间序列分解工具)是一个用Python编写的开源软件包，用于将日气象时间序列缩减(分解)为小时数据,2016年,它在Forster等人的GMD论文中有记载。\n",
    "- 在[pyaos的博客](http://pyaos.johnny-lin.com/)中可以找到各种气象有关的资源。\n",
    "\n",
    "统计学和数据分析工具非常丰富\n",
    "\n",
    "- CUAHSI[时间序列查看器](https://github.com/CUAHSI/timeseries_viewer)\n",
    "- [基本的备忘单](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf)(cheatsheet)\n",
    "- [NetCDF](https://www.unidata.ucar.edu/software/netcdf/)文件操作在[这里](http://unidata.github.io/netcdf4-python/)可用。但是，也有[txt2netcdf](http://python.hydrology-amsterdam.nl/modules/txt2netcdf.py),其中包含ko van Huissteden开发的用于将文本导入NetCDF数据文件(创建文件、添加变量、列表结构等)的各种Python函数。\n",
    "- [Pandas](http://pandas.pydata.org/)是一个开源的、BSD许可的库，为[Python](https://www.python.org/)提供了高性能、易用的数据结构和数据分析工具。(一个简短的[教程](http://www.scipy-lectures.org/packages/statistics/index.html)也在这里)\n",
    "- 极端分布也在[这里](https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.genextreme.html)(来自scipy.stats)\n",
    "- 一个使用Pandas分析时间序列的[例子](http://earthpy.org/pandas-basics.html)。\n",
    "\n",
    "可视化服务很好\n",
    "\n",
    "- [ggplot](http://ggplot.yhathq.com/)是一个基于R的[ggplot2](http://ggplot2.org/)和[图形语法](https://www.amazon.com/Grammar-Graphics-Statistics-Computing/dp/0387245448)的Python绘图系统。它以最少的代码量实现专业化的查看和快速的查询而建立的。\n",
    "- 在这个领域里，有一段令人印象深刻的Python之旅是“[回归印象](https://dsaber.com/2016/10/02/a-dramatic-tour-through-pythons-data-visualization-landscape-including-ggplot-and-altair/?utm_content=buffer4b569&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer/)”。\n",
    "- [VisTrails](https://github.com/UV-CDAT/VisTrails)是一个开源的科学工作流和支持数据探索和可视化的源管理系统。网站在[这儿](https://www.vistrails.org/index.php/Main_Page)。\n",
    "- [uvcmetrics](https://github.com/UV-CDAT/uvcmetrics)度量标准又称诊断，用于比较模型与观察值或相互之间的差异。 这是包含其他可视化工具的Uv-CDAT网站的一部分。\n",
    "\n",
    "处理不确定性和敏感性分析的工具\n",
    "- [Stijn Van Hoey工具](https://github.com/stijnvanhoey)\n",
    "\n",
    "最后的评论\n",
    "\n",
    "事实上，我对Python贡献的质量印象深刻。我认为没有理由在大学使用像Matlab这样的商业程序（请参阅此处的[评论](https://www.stat.washington.edu/~hoytak/blog/whypython.html)）。 Matlab能做的，Python也能做。与R相比，它有更清晰的语法，当然是更好的语言。所以我建议学生使用它。我喜欢R，但我从来没有建立过程序，因为它的对象方向真的很差。 Python更好，周所周知，它的语法是干净的。 Python很适合链接FORTRAN和C / C ++本地库，所以其实有很多人用它来组装那些用更高性能语言编写的库。\n",
    "\n",
    "但正如你所知，我的团队使用[Java](http://abouthydrology.blogspot.it/search/label/Java)作为其主要的编程语言。相比于Python，Java并不那么直接，且更为冗长，但是它可以建立很多[工作框架](http://abouthydrology.blogspot.it/2012/12/open-java-resources-for-hydrologists.html)，而且通常比Python更快。可能是因为，Java是由伟大的构建工具（[Maven](https://maven.apache.org/)，[Gradle](https://gradle.org/)）支持的，它允许以一种可能无法用Python完成的方式来管理大型项目。\n",
    "\n",
    "补充：\n",
    "\n",
    "- 一个使用PcRaster库，完全由Python编码的模型是开源[SPHY](www.sphy.nl)。有关模型和出版物(HESS,Nature等)的详细信息，这[这儿](http：//www.sphy.nl/)。一篇你关于PloS的气候变化和山区水文的论文使用了SPHY模型，详情请[见](http://www.futurewater.eu/2016/11/impacts-of-climate-change-on-the-upper-indus-basin/)。\n",
    "\n",
    "- 敏感性分析工具：\n",
    "    - [敏感性分析](https：//github.com/SALib/SALib):目前维护更加密集，包含pystran几乎所有泛，并刚刚在[JOSS](https://github.com/openjournals/joss)中进行了审查。我会推荐这个敏感性分析的链接。您也可以在本节中添加[pystran](https://github.com/stijnvanhoey/pystran)。\n",
    "    - 将[spotpy](http://fb09-pasig.umwelt.uni-giessen.de/spotpy/)添加到SA/UA/优化工具列表中，因为这为水文模型提供了许多有用的算法。\n",
    "\n",
    "- 统计和数据分析工具：[hydropy](https://github.com/stijnvanhoey/hydropy)旨在利用Pandas的强大功能，并增加水文功能(将得到进一步维护)。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
